package com.itheima.reggie.web.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.entity.Dish;
import com.itheima.reggie.entity.dto.DishDto;
import com.itheima.reggie.entity.dto.PageDto;
import com.itheima.reggie.service.DishService;
import com.itheima.reggie.web.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.Arrays;
import java.util.List;

/**
 * 菜品表现层
 */
@Slf4j
@RestController
@RequestMapping("/dish")
public class DishController {
    @Autowired
    private DishService dishService;

    /**
     * 新增菜品，包含口味信息
     *
     * @param dishDto 包含口味的菜品
     * @return 是否新增成功
     */
    @PostMapping
    // public R saveWithFlavor(@RequestBody DishDto dishDto) throws Exception {
    public R saveWithFlavor(@RequestBody DishDto dishDto) {
        // 记录日志
        log.info("新增菜品，菜品信息为：[{}]", dishDto);

        // 调用service保存
        // 组织数据并返回
        // return dishService.saveWithFlavorException(dishDto);
        return dishService.saveWithFlavor(dishDto);

    }


    /**
     * 按条件分页查询菜品(含菜品所属分类名称)
     *
     * @param pageDto 分页条件和查询条件
     * @return 符合要求的包含分类名称的菜品们
     * @Valid PageDto pageDto 就开启了该handler方法上对该pageDto对象的成员变量校验的开关
     */
    @GetMapping("/page")
    public R<Page<DishDto>> pageWithCategoryName(@Valid PageDto pageDto) {

        // 记录日志
        log.info("分页查询菜品，查第[ {} ]页，每页显示[ {} ]条，查询条件为：[{}]",
                pageDto.getPage(), pageDto.getPageSize(), pageDto.getName());

        // 调用Service查询
        // 组织数据并返回
        return dishService.pageWithCategoryName(pageDto);
    }


    /**
     * 根据id查询菜品（包含口味）
     *
     * @param id id
     * @return 要查询的菜品
     */
    @GetMapping("/{id}")
    public R<DishDto> findByIdWithFlavors(@PathVariable Long id) {
        // 记录日志
        log.info("根据id查询菜品(含口味)，id为：[{}]", id);

        if (id == null) {
            return R.fail("id不能为空");
        }
        // 调用service查询，组织数据并返回
        return dishService.getByIdWithFlavors(id);
    }


    /**
     * 保存修改菜品，包含口味信息
     *
     * @param dishDto 菜品对象(含口味)
     * @return 是否修改成功
     */
    @PutMapping
    public R updateByIdWithFlavors(@RequestBody DishDto dishDto) {
        // 记录日志
        log.info("根据id修改菜品，菜品信息为：[{}]", dishDto);

        // id 非空校验
        if (dishDto.getId() == null) {
            return R.fail("id为空，修改失败！");
        }

        // 调用service保存修改，并返回
        return dishService.updateByIdWithFlavors(dishDto);

    }


    /**
     * 批量起售停售
     *
     * @param status 目标状态
     * @param ids    目标id们
     * @return 是否成功
     */
    @PostMapping("/status/{status}")
    public R switchStatus(@PathVariable Integer status, Long[] ids) {
        // 记录日志
        log.info("批量{}，操作的id们为：[{}]", status == 0 ? "停售" : "起售", Arrays.toString(ids));

        // 参数校验
        if (status != null && (status == 0 || status == 1)) {
            // 调用service，组织数据并返回
            return dishService.switchStatus(status, ids);
        }
        return R.fail("目标状态有误！");
    }


    /**
     * 根据条件，查询符合要求的菜品（含口味）
     *
     * @param dish 查询条件
     * @return 符合要求的所有菜品（含口味）的集合
     */
    @GetMapping("/list")
    public R<List<DishDto>> listByCondition(Dish dish) {

        // 记录日志
        log.info("根据条件菜品，条件为：[ {} ]", dish);

        // 调用Service，查询并返回
        return dishService.listByCondition(dish);
    }
}
